#!/usr/bin/env python3
# Copyright (c) Meta Platforms, Inc. and affiliates.
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2.

# pyre-unsafe

import argparse
import errno
import hashlib
import os
import struct


MAIN_VERSION = "4.4.2"


def main() -> None:
    ap = argparse.ArgumentParser()
    ap.add_argument("--version", required=True)
    ap.add_argument("--release", required=True)
    ap.add_argument("--revision", required=True)
    ap.add_argument("output_path")
    args = ap.parse_args()

    # On POSIX single quotes are interpreted as empty strings, but on Windows
    # they are interpreted as literal single quotes so we have to get rid of
    # them. It's not possible to just use double quotes instead.
    # On Buck this script is called with arguments like
    # --version '%s' --release '%s' --revision '%s' <OUTPUT_PATH>
    # It's not possible to change the single quotes with double ones, because
    # otherwise buck interprets it as if we were empty and <OUTPUT_PATH> gets
    # parsed as a value for revision
    args.version = args.version.replace("'", "")
    args.release = args.release.replace("'", "")
    args.revision = args.revision.replace("'", "")

    if args.version and args.release:
        sub_version = "%s_%s_%s" % (args.version, args.release, args.revision[:8])
    elif args.revision:
        sub_version = args.revision[:8]
    else:
        # Buck does not pass in any build data info in dev builds
        sub_version = "dev"

    version = "%s_%s" % (MAIN_VERSION, sub_version)
    versionb = version.encode("ascii")
    versionhash = struct.unpack(">Q", hashlib.sha1(versionb).digest()[:8])[0]

    if args.output_path.endswith("py"):
        contents = (
            '# auto-generated by the build\nversion = "%s"\nversionhash = %s\n'
        ) % (version, versionhash)
    elif args.output_path.endswith("rs"):
        contents = (
            r"""// auto-generated by the build
pub static VERSION: &'static str = "%s";
pub static VERSION_HASH: &'static str = "%s";
            """
        ) % (version, versionhash)

    try:
        output_dir = os.path.dirname(args.output_path)
        os.makedirs(output_dir)
    except OSError as ex:
        if ex.errno != errno.EEXIST:
            raise

    with open(args.output_path, "w") as f:
        # pyre-fixme[61]: `contents` is undefined, or not always defined.
        f.write(contents)


main()
